/**
 *  ====== 观察者模式, 发布订阅模式 =============
 *  观察者模式 需要有两个类,  1. 被观察者 2. 观察者
 */

class Subject { // 1. 被观察者 => 被观察者状态变化, 要通知观察者
  constructor(name) {
    this.name = name
    this.observers = []
    this.state = "开心"
  }

  attach(observer) {
    this.observers.push(observer) // 订阅模式, 被观察者需要接收观察者
  }

  setState(newState) {// 只要被观察者状态一变化, 就通知观察者
    this.state = newState
    this.observers.forEach((observer) => {
      observer.update(newState)

    })
  }
}

class Observer { // 2. 观察者 => 观察者得放到被观察者身上,去观察它
  constructor(name) {
    this.name = name
  }

  // 设计模式的要求: 观察者, 必须要有一个 update
  update(state) {//观察者必须要提供一个 update, 每次被观察者状态一变
    console.log(this.name + ':' + "当前状态是" + state);
  }
}

// 我家有个小宝宝, 爸爸和妈妈要关心小宝宝的状态. 小宝宝不开心, 会主动通知观察者

let baby = new Subject("宝宝") // 被观察者

let observer1 = new Observer("爸爸") // 观察者1
let observer2 = new Observer("妈妈") // 观察者2

baby.attach(observer1) // 把观察者放到被观察者身上
baby.attach(observer2)
baby.setState("不开心")
